package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	//更改调度器可以使用的逻辑处理器的数量为1
	runtime.GOMAXPROCS(2)
	//WaitGroup 是一个计数信号量，可以用来记录并维护运行的 goroutine。如果 WaitGroup的值大于 0， Wait 方法就会阻塞
	var wg sync.WaitGroup
	//计数加 2，表示要等待两个 goroutine
	wg.Add(2)

	fmt.Println("Start Goroutines")

	// 申明一个匿名函数，并创建一个goroutine
	go func() {
		//关键字 defer 会修改函数调用时机，在正在执行的函数返回时才真正调用 defer 声明的函数
		//defer 在函数退出时调用Done来通知main函数工作已经完成
		defer wg.Done()
		//显示字母表三次
		for count := 0; count < 3; count++ {
			for char := 'a'; char < 'a'+26; char++ {
				fmt.Printf("%c ", char)
			}
		}
	}()

	go func() {
		defer wg.Done()
		for count := 0; count < 3; count++ {
			for char := 'A'; char < 'A'+26; char++ {
				fmt.Printf("%c ", char)
			}
		}
	}()

	//等待两个 goroutine执行完毕
	fmt.Println("\nWaiting To Finish")
	wg.Wait()
	fmt.Println("\nTerminating Program")
}
